package com.xcc.java_juc;


/**
 * 每个锁对象拥有一个锁计数器和一个指向持有该锁的线程的指针。
 *
 * 当执行monitorenter时，如果目标锋对象的计数器为零，那么说明它没有被其他线程所持有，Java虚拟机会将该锁对象的持有线程设
 * 置为当前线程，并且将其计数器加i。
 *
 * 在目标锁对象的计数器不为零的情况下，如果锁对象的持有线程是当前线程，那么Java虚拟机可以将其计数器加1，否则需要等待
 * ，直至持有线程释放该锁。
 *
 * 当执行monitorexit时，Java虚拟机则需将锁对象的计数器减1。计数器为零代表锁已被释放。
 */
public class Demo01_ReentrantLockSynchronizedBlock {

    static Object objectLock = new Object();

    /**
     * 代码块的可重入锁
     */
    private static void m1() {
        new Thread(()->{
            synchronized (objectLock) {
                System.out.println(Thread.currentThread().getName() + "==============外部");
                synchronized (objectLock) {
                    System.out.println(Thread.currentThread().getName() + "==============中部");
                    synchronized (objectLock) {
                        System.out.println(Thread.currentThread().getName() + "==============内部");
                    }
                }
            }
        },"t1").start();
    }

    public static void main(String[] args) {
        m1();
    }


}
